/***********************************************************************************
 * 文件名： btn_ctrl_static.c
 * 版本�?2
 * 说明�?
 * 		独立按钮控制器。扫描按钮，报告各种按钮事件。静态定义意味着只支�?个按钮，多个按钮�?
 *  使用 btn_ctrl 组件�?
 *      在合适的地方调用 Btn_Loop 确保其间�?0ms左右会被执行一次。当有按钮事件发生时，本组件
 *  会通过调用 Btn_Event 来进行通知，所以请在需要的地方实现 void Btn_Event(btn_ev_t e) �?
 *  数来接收按钮事件�?
 *      在文�?btn_ctrl_config.h 中进行合适的配置�?
 * 修改记录�?
 * 	2021/04/21: 初版�?刘言�?
 *  2021/05/12: 增加 Btn_IsDown()。刘言�?
***********************************************************************************/
#include "cpt-btn_ctrl_static.h"
#include "polsys.h"

static u8 Btn_mDxd = 0;
static u8 Btn_mUxd = 0xFF;     // 消抖计时变量
static u8 Btn_mClickCount = 0; // 点击次数

#ifdef _BTN_USE_IS_DOWN_FUNC
bit _Btn_mIsDown = false;
#endif

// 声明引用事件通知函数（避免使用函数指针的妥协�?
// 在你的应用代码中定义这个函数用于接收事件
void Btn_Event(btn_ev_t e);

//10ms执行一�?
void Btn_Loop()
{
    if (_Btn_HwIsDown())
    {
        if (Btn_mDxd == 1) //按下时间达到10ms
        {
#ifdef _BTN_USE_IS_DOWN_FUNC
            _Btn_mIsDown = true;
#endif
            Btn_Event(BTN_EV_DOWN);
            Btn_mUxd = 0;
        }
#ifdef BTN_USE_LONG_PRESS
        if (Btn_mDxd == _BTN_LONG_PRESS_TIME / 10) //按下的时间达�?
        {
            Btn_Event(BTN_EV_LONG_PRESS);
        }
#endif
        if (Btn_mDxd < 0xFF)
            Btn_mDxd++;
    }
    else
    {
        if (Btn_mUxd == 2) //松手的时间达�?0ms执行一�?
        {
#ifdef _BTN_USE_IS_DOWN_FUNC
            _Btn_mIsDown = false;
#endif
            Btn_Event(BTN_EV_UP); // 通知松手事件
            if (Btn_mDxd < 36)    // 如果按下的时间在0ms~360ms之间，认为是短按
            {
                Btn_mClickCount++;
#ifdef BTN_USE_CLICK
                if (Btn_mClickCount == 1)
                    Btn_Event(BTN_EV_CLICK);
#endif
                if (Btn_mClickCount == 5)
                    Btn_Event(BTN_EV_CLICK_5); // 5击事�?
            }
            //else
            //{
            /* 长按松手事件 */
            //}
            Btn_mDxd = 0; // 清零按下计时
        }
        else if (Btn_mUxd == 36) // 松手的时间达�?60ms
        {
            if (Btn_mClickCount < 5 && Btn_mClickCount > 1) // 2~4
            {
                Btn_Event(Btn_mClickCount + (BTN_EV_CLICK - 1));
            }
            Btn_mClickCount = 0;
        }
        if (Btn_mUxd < 0xFF)
            Btn_mUxd++;
    }
    //如果单独线程在此处加入Sleep(10);
}

void Btn_Init()
{
    Btn_mDxd = BTN_DXD_INIT;
    Btn_mUxd = 0xFF;     // ???????????
    Btn_mClickCount = 0; // ???????
}

void Btn_Init2()
{
    Btn_mDxd = 0;
    Btn_mUxd = 0xFF;     // ???????????
    Btn_mClickCount = 0; // ???????
}